<?php
class Util {

    public static function IsPInt($str){  //Test if str is a positive integer
        $str = strval($str);
        return isset($str) && ctype_digit($str) && (int)$str > 0 && (int)$str < 65536;
    }
    
    public static function HasValue($v, &$out = null){
        if (!isset($v))
          return false;
        if ((is_array($v) && count($v) > 0) || (is_bool($v) && $v == true) || (is_int($v) || is_float($v)) || (is_string($v) && strlen(trim($v))>0)){
          $out = $v;
          return true;
        }
        return false;
    }

    public static function HasValues(array $request, array $names = array(), &$out = null){
        foreach ($names as $n){
            if (!self::HasValue($request[$n]))
                return false;
        }
        $out = (object)$request;
        return true;
    }

    public static function GetGuid() {
        // The field names refer to RFC 4122 section 4.1.2

        return sprintf('%04x%04x%04x%03x4%04x%04x%04x%04x',
           mt_rand(0, 65535), mt_rand(0, 65535), // 32 bits for "time_low"
           mt_rand(0, 65535), // 16 bits for "time_mid"
           mt_rand(0, 4095),  // 12 bits before the 0100 of (version) 4 for "time_hi_and_version"
           bindec(substr_replace(sprintf('%016b', mt_rand(0, 65535)), '01', 6, 2)),
               // 8 bits, the last two of which (positions 6 and 7) are 01, for "clk_seq_hi_res"
               // (hence, the 2nd hex digit after the 3rd hyphen can only be 1, 5, 9 or d)
               // 8 bits for "clk_seq_low"
           mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(0, 65535) // 48 bits for "node"
        );
    }
    
    public static function DumpAllVars($var = null){
      if ($var != null)
        echo "<pre>".print_r($var, true)."</pre>";
      else
        echo "<pre>".print_r(get_defined_vars(), true)."</pre>";
    }
    
    public static function Now($offest = 0) {
      return date( 'Y-m-d H:i:s', time() + $offest );
    }
    
    static $EncodeOffset = 12345;
    public static function EncodeId($id){
      $id += self::$EncodeOffset;
      return base_convert($id, 10, 36);
    }
    
    public static function DecodeId($code){
      $id = (int)base_convert($code, 36, 10);
      $id -= self::$EncodeOffset;
      return $id;
    }
    
    public static function SanitizeText($text){
      return htmlentities($text, ENT_COMPAT, "UTF-8");
    }
    
    public static function SanitizeForUrl($text){
      $saned_title = str_replace("/", "", $text); 
      $saned_title = str_replace(" ", "-", $saned_title);
      return strtolower($saned_title);
    }
    
    public static function SimpleName($name){
      $name = str_replace(" ", "_", strtolower($name));
      $name = str_replace("-", "", $name);
      $name = str_replace("'", "", $name);
      return $name;
    }
    
    public static function NormalizeNewlines($text){
      $text = str_replace("\t", "", $text);
      $text = str_replace("\r", "", $text);
      return preg_replace("/[\n]{2,}/i", "\n\n", $text);
    }
    
    public static function Truncate($string, $length = 80, $etc = '...', $break_words = false, $middle = false){
        if ($length == 0)
            return '';
        if (strlen($string) > $length) {
            $length -= min($length, strlen($etc));
            if (!$break_words && !$middle) {
                $string = preg_replace('/\s+?(\S+)?$/', '', substr($string, 0, $length+1));
            }
            if(!$middle) {
                return substr($string, 0, $length) . $etc;
            } else {
                return substr($string, 0, $length/2) . $etc . substr($string, -$length/2);
            }
        } else {
            return $string;
        }
    }
    
    public static function ConvertLinks($text){
      return preg_replace_callback('@((https?://|www\.)([-\w\.]+[-\w])+(:\d+)?(/([\w/_\.#-]*(\?\S+)?[^\.\s])?)?)@', "_convert_links", $text);
    }
    
    public static function SendMail($to, $subject, $msg){
      $newfile="site/files/log.txt"; 
      $file = fopen($newfile, "w"); 
      fwrite($file, "To: $to\n\nSubject: $subject\n\nMsg:\n$msg"); 
      fclose ($file);
      mail($to, $subject, $msg);
    }
    
    function StripUnsafe($string, $img = false) 
    { 
        // Unsafe HTML tags that members may abuse 
        $unsafe=array( 
        '/<iframe(.*?)<\/iframe>/is', 
        '/<title(.*?)<\/title>/is', 
        '/<frame(.*?)<\/frame>/is', 
        '/<frameset(.*?)<\/frameset>/is', 
        //'/<object(.*?)<\/object>/is', 
        '/<script(.*?)<\/script>/is', 
        //'/<embed(.*?)<\/embed>/is', 
        '/<applet(.*?)<\/applet>/is', 
        '/<meta(.*?)>/is', 
        '/<!doctype(.*?)>/is', 
        '/<link(.*?)>/is', 
        '/<body(.*?)>/is', 
        '/<\/body>/is', 
        '/<head(.*?)>/is', 
        '/<\/head>/is', 
        '/onload="(.*?)"/is', 
        '/onunload="(.*?)"/is', 
        '/<html(.*?)>/is', 
        '/<\/html>/is'); 
         
        // Remove graphic too if the user wants 
        if ($img==true) 
        { 
            $unsafe[]='/<img(.*?)>/is'; 
        } 
         
        // Remove these tags and all parameters within them 
        $string=preg_replace($unsafe, "", $string); 
         
        return $string; 
    } 
    
    function OutputFile($file, $name, $mime_type='')
    {
     /*
     This function takes a path to a file to output ($file), 
     the filename that the browser will see ($name) and 
     the MIME type of the file ($mime_type, optional).
     
     If you want to do something on download abort/finish,
     register_shutdown_function('function_name');
     */
     if(!is_readable($file)) die('File not found or inaccessible!');
     
     $size = filesize($file);
     $name = rawurldecode($name);
     
     /* Figure out the MIME type (if not specified) */
     $known_mime_types=array(
       "pdf" => "application/pdf",
       "txt" => "text/plain",
       "html" => "text/html",
       "htm" => "text/html",
      "exe" => "application/octet-stream",
      "zip" => "application/zip",
      "doc" => "application/msword",
      "xls" => "application/vnd.ms-excel",
      "ppt" => "application/vnd.ms-powerpoint",
      "gif" => "image/gif",
      "png" => "image/png",
      "jpeg"=> "image/jpg",
      "jpg" =>  "image/jpg",
      "php" => "text/plain"
     );
     
     if($mime_type==''){
       $file_extension = strtolower(substr(strrchr($file,"."),1));
       if(array_key_exists($file_extension, $known_mime_types)){
        $mime_type=$known_mime_types[$file_extension];
       } else {
        $mime_type="application/force-download";
       };
     };
     
     @ob_end_clean(); //turn off output buffering to decrease cpu usage
     
     // required for IE, otherwise Content-Disposition may be ignored
     if(ini_get('zlib.output_compression'))
      ini_set('zlib.output_compression', 'Off');
     
     header('Content-Type: ' . $mime_type);
     header('Content-Disposition: attachment; filename="'.$name.'"');
     header("Content-Transfer-Encoding: binary");
     header('Accept-Ranges: bytes');
     
     /* The three lines below basically make the 
        download non-cacheable */
     header("Cache-control: private");
     header('Pragma: private');
     header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
     
     // multipart-download and download resuming support
     if(isset($_SERVER['HTTP_RANGE']))
     {
      list($a, $range) = explode("=",$_SERVER['HTTP_RANGE'],2);
      list($range) = explode(",",$range,2);
      list($range, $range_end) = explode("-", $range);
      $range=intval($range);
      if(!$range_end) {
        $range_end=$size-1;
      } else {
        $range_end=intval($range_end);
      }
     
      $new_length = $range_end-$range+1;
      header("HTTP/1.1 206 Partial Content");
      header("Content-Length: $new_length");
      header("Content-Range: bytes $range-$range_end/$size");
     } else {
      $new_length=$size;
      header("Content-Length: ".$size);
     }
     
     /* output the file itself */
     $chunksize = 1*(1024*1024); //you may want to change this
     $bytes_send = 0;
     if ($file = fopen($file, 'r'))
     {
      if(isset($_SERVER['HTTP_RANGE']))
      fseek($file, $range);
     
      while(!feof($file) && 
        (!connection_aborted()) && 
        ($bytes_send<$new_length)
            )
      {
        $buffer = fread($file, $chunksize);
        print($buffer); //echo($buffer); // is also possible
        flush();
        $bytes_send += strlen($buffer);
      }
     fclose($file);
     } else die('Error - can not open file.');
     
    die();
    }
        
}

function _convert_links($matches){
  return '<a href="'.$matches[1].'" target="_blank">'.Util::Truncate($matches[1],24).'</a>';
}

?>